What will this workshop cover?
The goal of this session is to get to started using RStudio, learn how to use variables and solve basic calculations in R. We will cover:
- Introduction to RStudio
- Using r as a calculator
- Assigning variables
- Numerical variables
Why R
R is a popular language, especially in data science, this can be seen in the TIOBE Index for August 2020.

It has lots of strengths:
- Excellent at handling data
- Very good for statistics
- Open source
- You can do almost anything in R due to community written ‘packages’
- Makes pretty and complex data visualisations (see below)

Introduction to RStudio
RStudio by default has four main quadrants as shown below. The layout is customisable, as is the background.

When you load RStudio the syntax editor will not be open. Try and open one just like as shown below.

Using R markdown
For these workshops we will be using R Markdown. It allows you to have text (with simple formatting) and chunks of R code.

To run code in a code chunk either press the green play button or press Ctrl + Enter (or Cmd + Enter on Mac).
Using R as a calculator
We can use R to do simple or advanced calculations for us. Remember to run the code press the green play button or press Ctrl + Enter (or Cmd + Enter on Mac).
## [1] 42
## [1] 1.25
## [1] 21
R as calculator exercise
Use R to work out the following arithmetic:
- 44 * 26
- 9.6/1.6
- (12+4)^2
- (4*9)/(5+6)
- (22/36) * 100
- The remainder of 55 / 2 (hint: look up r’s modulus operator)
# type your code here
44 * 26
## [1] 1144
## [1] 6
## [1] 256
## [1] 3.272727
## [1] 61.11111
## [1] 1
Assigning variables
A variable is a named storage of information. In our case today we are storing numbers.
We can assign variables by using <-. You should see the variable appear to your right in the global environment once you’ve run this command (under Values).
We can then print the output of the variable by typing in its name.
## [1] 155
When calling a variable, be careful to type it exactly (you can also copy it or use code completion to help). The code below will give you an error because we have spelt height incorrectly.
## Error in eval(expr, envir, enclos): object 'hieght' not found
We can do calculations on variables. We first assign the variables, then use them in the calculation.
In the example below, Score1 is 42, Score2 is 92 and so on. If we calculate Score1 * Score2 what is really happening is 42 * 92, as this is the data scored in those variables. Run the code, and review the output as well as the variables we have made in the global environment (top right panel in RStudio).
# test scores
Score1 <- 42
Score2 <- 92
Score3 <- 68
# average score calculation
AveScore <- (Score1+Score2+Score3)/3
# print average score
AveScore
## [1] 67.33333
You will have noticed the hashtags (#) with text in the above example. These are called comments. In later R sessions we will use a lot of comments to tell us (and others) what each line or section of code is doing.
Assigning variables exercise 1
- Make a variable called my_height, and assign your height in cm (this can be an estimate if you are not sure)
- Print the output of my_height
- Convert your height in cm to feet. Make a new variable called my_height_feet, and assign the calculation of your height in cm to feet. hint: there are 0.0328084 feet in 1 cm
- Print your my_height_feet variable
# your code here
my_height <- 195
my_height
## [1] 195
my_height_feet <- my_height * 0.0328084
my_height_feet
## [1] 6.397638
Reassigning variables
You can also change the value of a variable you have already assigned. Here we are going to add our new pay check to our previous bank balance.
Run this code to test it out:
# create variables
BankBalance <- 100
PayCheck <- 250
# add old bank balance and pay check, assigning result to bank balance
BankBalance <- BankBalance + PayCheck
# print bank balance
BankBalance
## [1] 350
Note that if you run BankBalance <- BankBalance + PayCheck line of code twice you will get a higher bank balance (600 rather than 350). This is because code works sequentially in R and the order you run commands matters. See the example below on what happens if we repeat adding numbers to a total.
# variables
number <- 5
total <- 0
# adding number to total
total <- total + number
total
## [1] 5
total <- total + number
total
## [1] 10
total <- total + number
total
## [1] 15
Reassigning variables exercise
Try and add another pay check of £50 to the bank balance variable.
- Make a variable called PayCheck2 with a value of 50
- Assign BankBalance, and calculate BankBalance + PayCheck2
- Print the outcome
- You go out for dinner with friends and spend 36.55. Make a variable called dinner with the value of 36.55
- Assign BankBalance, and calculate BankBalance - dinner
- Print the outcome hint: if this doesn’t work run the code chunk with the bank balance variable
# your code here
PayCheck2 <- 50
BankBalance <- BankBalance + PayCheck2
BankBalance
## [1] 400
dinner <- 36.55
BankBalance <- BankBalance - dinner
BankBalance
## [1] 363.45
Assigning variables exercise 2
Use R to work out a body mass index (BMI) of someone who is 79kg, and 1.77m tall.
- Assign the variables of weight and height
- Assign the variable of BMI, and calculate the BMI based of the weight and height variables
- Print the outcome
- Add comments on what each line of code is doing
# Exercise: BMI calculation
# assign variables of weight and height
weight <- 79
height <- 1.77
# BMI calculation
BMI <- weight/(height^2)
# print outcome
BMI
## [1] 25.21625
Overall grade calculation debugging exercise
Debug the code below that is finding the weighted average of a students coursework and exam scores. You should find three errors:
- logic (maths) error
- syntax error
- naming error
# Exercise: weighted average debugging
exam1 <- 52
coursework1 <- 82
exam2 <- 78
coursework2 <- 48 # assignment operator missing - (should be <-)
cw_weight <- 0.4
ex_weight <- 0.6
course1 <- (exam1 * ex_weight) + (coursework1 * cw_weight) # variable is coursework1
course2 <- (exam2 * ex_weight) + (coursework2 * cw_weight)
overall_grade <- (course1 + course2)/2 # should be divided by 2, as there are two courses not three
overall_grade
## [1] 65
Salary calculation exercise
Robin and Charlie are a married couple, one gets paid an hourly rate, the other has an annual salary. They want to workout how much annual salary they have combined before tax. Out of interest Charlie also wants to know what her hourly rate is before tax.
They used simple calculations using the following formulas:
(number hours worked per week x hourly rate) x number of weeks worked = annual salary (annual salary ÷ number of weeks in a year) ÷ hours worked per week = hourly rate
Re-arrange the code so the calculations run. You should have both the combined salary and Charlies hourly rate calculations printed.
# Note: Hours worked, salaries and weeks in year can be in any order but need
# to be above the rest of the code
# hours worked
Robin_hoursPerWeek <- 25
Robin_weeksWorking <- 48
Charlie_hoursPerWeek <- 35
# salaries
Robin_HourlyRate <- 16.5
Charlie_annualSary <- 31800
# weeks in year
weeksYear <- 52
# Charlies hourly rate
Charlie_HourlyRate <- (Charlie_annualSary / weeksYear)/Charlie_hoursPerWeek
Charlie_HourlyRate
# Robins annual salary
Robin_annualSalary <- (Robin_hoursPerWeek * Robin_HourlyRate) * Robin_weeksWorking
Robin_annualSalary
# Combined salaries
CombinedSalaries <- Robin_annualSalary + Charlie_annualSary
CombinedSalaries
Individual coding challenge
A take home coding task for you.
Task: Splitting a Pizza Pilgrims restaurant bill between 3 friends; Roger, Amal and Genevieve.
- Roger has a Calzone Ripieno (£11), and a San Pellegrino (£2).
- Amal has a Bufala (£9), and Birra Moretti (£4.50).
- Genevieve has a Portobello Mushroom & Truffle (£10), and water to drink.
- Genevieve and Amal also share a Nutella Pizza ring for dessert (£5.5).

- Make a variable for each friend that is the sum of their order (e.g. Roger would be 11 + 2)
- Make a variable for the shared food
- Make a variable called TotalBill, and calculate their total bill
- For those that shared food, add the shared food to their bill
- Comment your code
- Print the total bill and what each friend owes
# individual coding challenge
# sum of order and shared food
Roger <- 11 + 2
Amal <- 9 + 4.5
Genevieve <- 10
SharedFood <- 5.5
# bill total
TotalBill <- Roger + Amal + Genevieve + SharedFood
# shared food sum
Amal <- Amal + (SharedFood/2)
Genevieve <- Genevieve + (SharedFood/2)
# total bill
TotalBill
## [1] 42
## [1] 13
## [1] 16.25
## [1] 12.75
LS0tCnRpdGxlOiAiUiBGdW5kYW1lbnRhbHMgMTogTnVtZXJpY2FsIFZhcmlhYmxlcyIKYXV0aG9yOgogICAtIG5hbWU6IEFuZHJldyBNb2xlcwogICAgIGFmZmlsaWF0aW9uOiBMZWFybmluZyBEZXZlbG9wZXIsIERpZ2l0YWwgU2tpbGxzIExhYgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDogCiAgICB0aGVtZTogcmVhZGFibGUKICAgIGhpZ2hsaWdodDogcHlnbWVudHMKICAgIGtlZXBfbWQ6IHllcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IGZhbHNlCi0tLQoKIyBXaGF0IHdpbGwgdGhpcyB3b3Jrc2hvcCBjb3Zlcj8KClRoZSBnb2FsIG9mIHRoaXMgc2Vzc2lvbiBpcyB0byBnZXQgdG8gc3RhcnRlZCB1c2luZyBSU3R1ZGlvLCBsZWFybiBob3cgdG8gdXNlIHZhcmlhYmxlcyBhbmQgc29sdmUgYmFzaWMgY2FsY3VsYXRpb25zIGluIFIuIFdlIHdpbGwgY292ZXI6CgotICAgSW50cm9kdWN0aW9uIHRvIFJTdHVkaW8KLSAgIFVzaW5nIHIgYXMgYSBjYWxjdWxhdG9yCi0gICBBc3NpZ25pbmcgdmFyaWFibGVzCi0gICBOdW1lcmljYWwgdmFyaWFibGVzCgojIEluZm9ybWF0aW9uIG9uIGhvdyB0aGUgc2Vzc2lvbiBpcyBydW4KCk9uZSBob3VyIGV4ZXJjaXNlIGJhc2VkIHNlc3Npb24gd2l0aCB0dXRvciBzdXBwb3J0LiBZb3Ugd2lsbCBiZSBnaXZlbiBleGFtcGxlIGNvZGUgZm9yIGEgcHJvYmxlbSwgdGhlbiBnaXZlbiBhIHJlbGF0ZWQgZXhlcmNpc2UgdG8gY29tcGxldGUuCgojIyBXaHkgdGhpcyBzdHlsZT8KCi0gICBPbmxpbmUgdHJhaW5pbmcgaXMgdGlyaW5nIHNvIGtlZXBpbmcgdGhlIHNlc3Npb25zIHRvIG9uZSBob3VyCi0gICBObyBvciBsaW1pdGVkIGRlbW9uc3RyYXRpb25zIHByb3ZpZGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgbW9yZSByZWFsIHdvcmxkIGV4cGVyaWVuY2UgLSB5b3UgaGF2ZSBhIHByb2JsZW0gYW5kIHlvdSBsb29rIHVwIGhvdyB0byBzb2x2ZSBpdCwgYWRhcHRpbmcgZXhhbXBsZSBjb2RlCi0gICBUcmFpbmVyIHN1cHBvcnQgdG8gZ3VpZGUgdGhyb3VnaCBwcm9jZXNzIG9mIGxlYXJuaW5nCgojIyBXZSB3aWxsIGJlIHdvcmtpbmcgaW4gcGFpcnM6CgotICAgT25lIHNoYXJlcyB0aGUgc2NyZWVuIGFuZCB0aGUgb3RoZXIgcmVxdWVzdHMgcmVtb3RlIGNvbnRyb2wuCi0gICBUYWtlIHR1cm5zIG9uIHdobyB0eXBlcyBmb3IgZWFjaCBleGVyY2lzZS4KLSAgIFNoYXJlIG1hcmtkb3duIGZpbGUgYXQgZW5kIG9mIHNlc3Npb24gdmlhIGNoYXQKLSAgIElmIHBvc3NpYmxlIGhhdmUgeW91ciBjYW1lcmEgb24gd2hlbiBkb2luZyB0aGUgcGFpcmVkIHdvcmsuCgojIyBXaGF0IHRvIGRvIHdoZW4gZ2V0dGluZyBzdHVjazoKCjEpICBBc2sgeW91ciB0ZWFtIG1lbWJlcnMKMikgIFNlYXJjaCBvbmxpbmU6CgotICAgVGhlIGFuc3dlciBib3ggb24gdGhlIHRvcCBvZiBHb29nbGUncyByZXN1bHRzIHBhZ2UKLSAgIHN0YWNrb3ZlcmZsb3cuY29tIChmb3IgdGFzay1zcGVjaWZpYyBzb2x1dGlvbnMpCi0gICA8aHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vPiAodG9waWMgYmFzZWQgdHV0b3JpYWxzKQoKMykgIERvbid0IHN0cnVnZ2xlIHRvbyBsb25nIGxvb2tpbmcgb25saW5lLCBhc2sgdGhlIHRyYWluZXIgaWYgeW91IGNhbid0IGZpbmQgYSBzb2x1dGlvbiEKCiMgV2h5IFIKClIgaXMgYSBwb3B1bGFyIGxhbmd1YWdlLCBlc3BlY2lhbGx5IGluIGRhdGEgc2NpZW5jZSwgdGhpcyBjYW4gYmUgc2VlbiBpbiB0aGUgVElPQkUgSW5kZXggZm9yIEF1Z3VzdCAyMDIwLgoKIVtdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdtb2xlczIvclRyYWluSW50cm9kdWN0aW9uL2Jsb2IvbWFpbi9yLWZ1bmRhbWVudGFscy0xL0ltYWdlcy90aW9iZS1pbmRleC5wbmc/cmF3PXRydWUpCgpJdCBoYXMgbG90cyBvZiBzdHJlbmd0aHM6CgotICAgRXhjZWxsZW50IGF0IGhhbmRsaW5nIGRhdGEKLSAgIFZlcnkgZ29vZCBmb3Igc3RhdGlzdGljcwotICAgT3BlbiBzb3VyY2UKLSAgIFlvdSBjYW4gZG8gYWxtb3N0IGFueXRoaW5nIGluIFIgZHVlIHRvIGNvbW11bml0eSB3cml0dGVuICdwYWNrYWdlcycKLSAgIE1ha2VzIHByZXR0eSBhbmQgY29tcGxleCBkYXRhIHZpc3VhbGlzYXRpb25zIChzZWUgYmVsb3cpCgohW10oaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld21vbGVzMi9UaWR5VHVlc2RheS9ibG9iL21hc3Rlci9BdXN0cmFsaWEtZmlyZXMtMjAyMC0wMS0wNy9BdXpfUmFpbiZUZW1wLmdpZj9yYXc9dHJ1ZSkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBJbnRyb2R1Y3Rpb24gdG8gUlN0dWRpbwoKUlN0dWRpbyBieSBkZWZhdWx0IGhhcyBmb3VyIG1haW4gcXVhZHJhbnRzIGFzIHNob3duIGJlbG93LiBUaGUgbGF5b3V0IGlzIGN1c3RvbWlzYWJsZSwgYXMgaXMgdGhlIGJhY2tncm91bmQuCgohW10oaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld21vbGVzMi9yVHJhaW5JbnRyb2R1Y3Rpb24vYmxvYi9tYWluL3ItZnVuZGFtZW50YWxzLTEvSW1hZ2VzL3JzdHVkaW9FbnYucG5nP3Jhdz10cnVlKQoKV2hlbiB5b3UgbG9hZCBSU3R1ZGlvIHRoZSBzeW50YXggZWRpdG9yIHdpbGwgbm90IGJlIG9wZW4uIFRyeSBhbmQgb3BlbiBvbmUganVzdCBsaWtlIGFzIHNob3duIGJlbG93LgoKIVtdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdtb2xlczIvclRyYWluSW50cm9kdWN0aW9uL2Jsb2IvbWFpbi9yLWZ1bmRhbWVudGFscy0xL0ltYWdlcy9zY3JpcHRzLnBuZz9yYXc9dHJ1ZSkKCiMgVXNpbmcgUiBtYXJrZG93bgoKRm9yIHRoZXNlIHdvcmtzaG9wcyB3ZSB3aWxsIGJlIHVzaW5nIFIgTWFya2Rvd24uIEl0IGFsbG93cyB5b3UgdG8gaGF2ZSB0ZXh0ICh3aXRoIHNpbXBsZSBmb3JtYXR0aW5nKSBhbmQgY2h1bmtzIG9mIFIgY29kZS4KCiFbXShodHRwczovL2dpdGh1Yi5jb20vYW5kcmV3bW9sZXMyL3JUcmFpbkludHJvZHVjdGlvbi9ibG9iL21haW4vci1mdW5kYW1lbnRhbHMtMS9JbWFnZXMvUk1hcmtkb3duLnBuZz9yYXc9dHJ1ZSkKClRvIHJ1biBjb2RlIGluIGEgY29kZSBjaHVuayBlaXRoZXIgcHJlc3MgdGhlIGdyZWVuIHBsYXkgYnV0dG9uIG9yIHByZXNzIEN0cmwgKyBFbnRlciAob3IgQ21kICsgRW50ZXIgb24gTWFjKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBVc2luZyBSIGFzIGEgY2FsY3VsYXRvcgoKV2UgY2FuIHVzZSBSIHRvIGRvIHNpbXBsZSBvciBhZHZhbmNlZCBjYWxjdWxhdGlvbnMgZm9yIHVzLiBSZW1lbWJlciB0byBydW4gdGhlIGNvZGUgcHJlc3MgdGhlIGdyZWVuIHBsYXkgYnV0dG9uIG9yIHByZXNzIEN0cmwgKyBFbnRlciAob3IgQ21kICsgRW50ZXIgb24gTWFjKS4KCmBgYHtyfQo3ICogNgo1IC8gKDJeMikKKDE2IC0gNCkgKyAoMSAqIDkpCmBgYAoKIyMgUiBhcyBjYWxjdWxhdG9yIGV4ZXJjaXNlCgpVc2UgUiB0byB3b3JrIG91dCB0aGUgZm9sbG93aW5nIGFyaXRobWV0aWM6CgoxKSAgNDQgXCogMjYKMikgIDkuNi8xLjYKMykgICgxMis0KVxeMgo0KSAgKDRcKjkpLyg1KzYpCjUpICAoMjIvMzYpIFwqIDEwMAo2KSAgVGhlIHJlbWFpbmRlciBvZiA1NSAvIDIgKGhpbnQ6IGxvb2sgdXAgcidzIG1vZHVsdXMgb3BlcmF0b3IpCgpgYGB7cn0KIyB0eXBlIHlvdXIgY29kZSBoZXJlCjQ0ICogMjYKOS42IC8gMS42CigxMiArIDQpXjIKKDQgKiA5KS8oNSArIDYpCigyMiAvIDM2KSAqIDEwMAo1NSUlMgpgYGAKCiMgQXNzaWduaW5nIHZhcmlhYmxlcwoKQSB2YXJpYWJsZSBpcyBhIG5hbWVkIHN0b3JhZ2Ugb2YgaW5mb3JtYXRpb24uIEluIG91ciBjYXNlIHRvZGF5IHdlIGFyZSBzdG9yaW5nIG51bWJlcnMuCgpXZSBjYW4gYXNzaWduIHZhcmlhYmxlcyBieSB1c2luZyBcPC0uIFlvdSBzaG91bGQgc2VlIHRoZSB2YXJpYWJsZSBhcHBlYXIgdG8geW91ciByaWdodCBpbiB0aGUgZ2xvYmFsIGVudmlyb25tZW50IG9uY2UgeW91J3ZlIHJ1biB0aGlzIGNvbW1hbmQgKHVuZGVyIFZhbHVlcykuCgpgYGB7cn0KaGVpZ2h0IDwtIDE1NQpgYGAKCldlIGNhbiB0aGVuIHByaW50IHRoZSBvdXRwdXQgb2YgdGhlIHZhcmlhYmxlIGJ5IHR5cGluZyBpbiBpdHMgbmFtZS4KCmBgYHtyfQpoZWlnaHQKYGBgCgpXaGVuIGNhbGxpbmcgYSB2YXJpYWJsZSwgYmUgY2FyZWZ1bCB0byB0eXBlIGl0IGV4YWN0bHkgKHlvdSBjYW4gYWxzbyBjb3B5IGl0IG9yIHVzZSBjb2RlIGNvbXBsZXRpb24gdG8gaGVscCkuIFRoZSBjb2RlIGJlbG93IHdpbGwgZ2l2ZSB5b3UgYW4gZXJyb3IgYmVjYXVzZSB3ZSBoYXZlIHNwZWx0IGhlaWdodCBpbmNvcnJlY3RseS4KCmBgYHtyIGVycm9yPVRSVUV9CmhpZWdodApgYGAKCldlIGNhbiBkbyBjYWxjdWxhdGlvbnMgb24gdmFyaWFibGVzLiBXZSBmaXJzdCBhc3NpZ24gdGhlIHZhcmlhYmxlcywgdGhlbiB1c2UgdGhlbSBpbiB0aGUgY2FsY3VsYXRpb24uCgpJbiB0aGUgZXhhbXBsZSBiZWxvdywgU2NvcmUxIGlzIDQyLCBTY29yZTIgaXMgOTIgYW5kIHNvIG9uLiBJZiB3ZSBjYWxjdWxhdGUgU2NvcmUxIFwqIFNjb3JlMiB3aGF0IGlzIHJlYWxseSBoYXBwZW5pbmcgaXMgNDIgXCogOTIsIGFzIHRoaXMgaXMgdGhlIGRhdGEgc2NvcmVkIGluIHRob3NlIHZhcmlhYmxlcy4gUnVuIHRoZSBjb2RlLCBhbmQgcmV2aWV3IHRoZSBvdXRwdXQgYXMgd2VsbCBhcyB0aGUgdmFyaWFibGVzIHdlIGhhdmUgbWFkZSBpbiB0aGUgZ2xvYmFsIGVudmlyb25tZW50ICh0b3AgcmlnaHQgcGFuZWwgaW4gUlN0dWRpbykuCgpgYGB7cn0KIyB0ZXN0IHNjb3JlcwpTY29yZTEgPC0gNDIKU2NvcmUyIDwtIDkyClNjb3JlMyA8LSA2OAojIGF2ZXJhZ2Ugc2NvcmUgY2FsY3VsYXRpb24KQXZlU2NvcmUgPC0gKFNjb3JlMStTY29yZTIrU2NvcmUzKS8zCiMgcHJpbnQgYXZlcmFnZSBzY29yZQpBdmVTY29yZQpgYGAKCllvdSB3aWxsIGhhdmUgbm90aWNlZCB0aGUgaGFzaHRhZ3MgKFwjKSB3aXRoIHRleHQgaW4gdGhlIGFib3ZlIGV4YW1wbGUuIFRoZXNlIGFyZSBjYWxsZWQgY29tbWVudHMuIEluIGxhdGVyIFIgc2Vzc2lvbnMgd2Ugd2lsbCB1c2UgYSBsb3Qgb2YgY29tbWVudHMgdG8gdGVsbCB1cyAoYW5kIG90aGVycykgd2hhdCBlYWNoIGxpbmUgb3Igc2VjdGlvbiBvZiBjb2RlIGlzIGRvaW5nLgoKYGBge3J9CiMgdGhpcyBpcyBhIGNvbW1lbnQKYGBgCgojIyBBc3NpZ25pbmcgdmFyaWFibGVzIGV4ZXJjaXNlIDEKCjEpICBNYWtlIGEgdmFyaWFibGUgY2FsbGVkIG15X2hlaWdodCwgYW5kIGFzc2lnbiB5b3VyIGhlaWdodCBpbiBjbSAodGhpcyBjYW4gYmUgYW4gZXN0aW1hdGUgaWYgeW91IGFyZSBub3Qgc3VyZSkKMikgIFByaW50IHRoZSBvdXRwdXQgb2YgbXlfaGVpZ2h0CjMpICBDb252ZXJ0IHlvdXIgaGVpZ2h0IGluIGNtIHRvIGZlZXQuIE1ha2UgYSBuZXcgdmFyaWFibGUgY2FsbGVkIG15X2hlaWdodF9mZWV0LCBhbmQgYXNzaWduIHRoZSBjYWxjdWxhdGlvbiBvZiB5b3VyIGhlaWdodCBpbiBjbSB0byBmZWV0LiAqaGludDogdGhlcmUgYXJlIDAuMDMyODA4NCBmZWV0IGluIDEgY20qCjQpICBQcmludCB5b3VyIG15X2hlaWdodF9mZWV0IHZhcmlhYmxlCgpgYGB7cn0KIyB5b3VyIGNvZGUgaGVyZQpteV9oZWlnaHQgPC0gMTk1Cm15X2hlaWdodAoKbXlfaGVpZ2h0X2ZlZXQgPC0gIG15X2hlaWdodCAqIDAuMDMyODA4NApteV9oZWlnaHRfZmVldApgYGAKCiMgUmVhc3NpZ25pbmcgdmFyaWFibGVzCgpZb3UgY2FuIGFsc28gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIHlvdSBoYXZlIGFscmVhZHkgYXNzaWduZWQuIEhlcmUgd2UgYXJlIGdvaW5nIHRvIGFkZCBvdXIgbmV3IHBheSBjaGVjayB0byBvdXIgcHJldmlvdXMgYmFuayBiYWxhbmNlLgoKKlJ1biB0aGlzIGNvZGUgdG8gdGVzdCBpdCBvdXQ6KgoKYGBge3J9CiMgY3JlYXRlIHZhcmlhYmxlcwpCYW5rQmFsYW5jZSA8LSAxMDAKUGF5Q2hlY2sgPC0gMjUwCiMgYWRkIG9sZCBiYW5rIGJhbGFuY2UgYW5kIHBheSBjaGVjaywgYXNzaWduaW5nIHJlc3VsdCB0byBiYW5rIGJhbGFuY2UKQmFua0JhbGFuY2UgPC0gQmFua0JhbGFuY2UgKyBQYXlDaGVjawojIHByaW50IGJhbmsgYmFsYW5jZQpCYW5rQmFsYW5jZQpgYGAKCk5vdGUgdGhhdCBpZiB5b3UgcnVuIGBCYW5rQmFsYW5jZSA8LSBCYW5rQmFsYW5jZSArIFBheUNoZWNrYCBsaW5lIG9mIGNvZGUgdHdpY2UgeW91IHdpbGwgZ2V0IGEgaGlnaGVyIGJhbmsgYmFsYW5jZSAoNjAwIHJhdGhlciB0aGFuIDM1MCkuIFRoaXMgaXMgYmVjYXVzZSBjb2RlIHdvcmtzIHNlcXVlbnRpYWxseSBpbiBSIGFuZCB0aGUgb3JkZXIgeW91IHJ1biBjb21tYW5kcyBtYXR0ZXJzLiBTZWUgdGhlIGV4YW1wbGUgYmVsb3cgb24gd2hhdCBoYXBwZW5zIGlmIHdlIHJlcGVhdCBhZGRpbmcgbnVtYmVycyB0byBhIHRvdGFsLgoKYGBge3J9CiMgdmFyaWFibGVzCm51bWJlciA8LSA1CnRvdGFsIDwtIDAKIyBhZGRpbmcgbnVtYmVyIHRvIHRvdGFsCnRvdGFsIDwtIHRvdGFsICsgbnVtYmVyCnRvdGFsCnRvdGFsIDwtIHRvdGFsICsgbnVtYmVyCnRvdGFsCnRvdGFsIDwtIHRvdGFsICsgbnVtYmVyCnRvdGFsCmBgYAoKIyMgUmVhc3NpZ25pbmcgdmFyaWFibGVzIGV4ZXJjaXNlCgpUcnkgYW5kIGFkZCBhbm90aGVyIHBheSBjaGVjayBvZiDCozUwIHRvIHRoZSBiYW5rIGJhbGFuY2UgdmFyaWFibGUuCgoxKSAgTWFrZSBhIHZhcmlhYmxlIGNhbGxlZCBQYXlDaGVjazIgd2l0aCBhIHZhbHVlIG9mIDUwCjIpICBBc3NpZ24gQmFua0JhbGFuY2UsIGFuZCBjYWxjdWxhdGUgQmFua0JhbGFuY2UgKyBQYXlDaGVjazIKMykgIFByaW50IHRoZSBvdXRjb21lCjQpICBZb3UgZ28gb3V0IGZvciBkaW5uZXIgd2l0aCBmcmllbmRzIGFuZCBzcGVuZCAzNi41NS4gTWFrZSBhIHZhcmlhYmxlIGNhbGxlZCBkaW5uZXIgd2l0aCB0aGUgdmFsdWUgb2YgMzYuNTUKNSkgIEFzc2lnbiBCYW5rQmFsYW5jZSwgYW5kIGNhbGN1bGF0ZSBCYW5rQmFsYW5jZSAtIGRpbm5lcgo2KSAgUHJpbnQgdGhlIG91dGNvbWUgKmhpbnQ6IGlmIHRoaXMgZG9lc24ndCB3b3JrIHJ1biB0aGUgY29kZSBjaHVuayB3aXRoIHRoZSBiYW5rIGJhbGFuY2UgdmFyaWFibGUqCgpgYGB7cn0KIyB5b3VyIGNvZGUgaGVyZQpQYXlDaGVjazIgPC0gNTAKQmFua0JhbGFuY2UgPC0gQmFua0JhbGFuY2UgKyBQYXlDaGVjazIKQmFua0JhbGFuY2UKCmRpbm5lciA8LSAzNi41NQpCYW5rQmFsYW5jZSA8LSBCYW5rQmFsYW5jZSAtIGRpbm5lcgpCYW5rQmFsYW5jZQpgYGAKCiMjIEFzc2lnbmluZyB2YXJpYWJsZXMgZXhlcmNpc2UgMgoKVXNlIFIgdG8gd29yayBvdXQgYSBib2R5IG1hc3MgaW5kZXggKEJNSSkgb2Ygc29tZW9uZSB3aG8gaXMgNzlrZywgYW5kIDEuNzdtIHRhbGwuCgoxKSAgQXNzaWduIHRoZSB2YXJpYWJsZXMgb2Ygd2VpZ2h0IGFuZCBoZWlnaHQKMikgIEFzc2lnbiB0aGUgdmFyaWFibGUgb2YgQk1JLCBhbmQgY2FsY3VsYXRlIHRoZSBCTUkgYmFzZWQgb2YgdGhlIHdlaWdodCBhbmQgaGVpZ2h0IHZhcmlhYmxlcwozKSAgUHJpbnQgdGhlIG91dGNvbWUKNCkgIEFkZCBjb21tZW50cyBvbiB3aGF0IGVhY2ggbGluZSBvZiBjb2RlIGlzIGRvaW5nCgpgYGB7cn0KIyBFeGVyY2lzZTogQk1JIGNhbGN1bGF0aW9uCiMgYXNzaWduIHZhcmlhYmxlcyBvZiB3ZWlnaHQgYW5kIGhlaWdodAp3ZWlnaHQgPC0gNzkKaGVpZ2h0IDwtIDEuNzcKCiMgQk1JIGNhbGN1bGF0aW9uCkJNSSA8LSB3ZWlnaHQvKGhlaWdodF4yKQoKIyBwcmludCBvdXRjb21lCkJNSQpgYGAKCiMjIE92ZXJhbGwgZ3JhZGUgY2FsY3VsYXRpb24gZGVidWdnaW5nIGV4ZXJjaXNlCgpEZWJ1ZyB0aGUgY29kZSBiZWxvdyB0aGF0IGlzIGZpbmRpbmcgdGhlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgYSBzdHVkZW50cyBjb3Vyc2V3b3JrIGFuZCBleGFtIHNjb3Jlcy4gWW91IHNob3VsZCBmaW5kIHRocmVlIGVycm9yczoKCi0gICBsb2dpYyAobWF0aHMpIGVycm9yCi0gICBzeW50YXggZXJyb3IKLSAgIG5hbWluZyBlcnJvcgoKYGBge3IgZXJyb3I9VFJVRX0KIyBFeGVyY2lzZTogd2VpZ2h0ZWQgYXZlcmFnZSBkZWJ1Z2dpbmcKZXhhbTEgPC0gNTIKY291cnNld29yazEgPC0gODIKZXhhbTIgPC0gNzgKY291cnNld29yazIgPC0gNDggIyBhc3NpZ25tZW50IG9wZXJhdG9yIG1pc3NpbmcgLSAoc2hvdWxkIGJlIDwtKQoKY3dfd2VpZ2h0IDwtIDAuNApleF93ZWlnaHQgPC0gMC42Cgpjb3Vyc2UxIDwtIChleGFtMSAqIGV4X3dlaWdodCkgKyAoY291cnNld29yazEgKiBjd193ZWlnaHQpICMgdmFyaWFibGUgaXMgY291cnNld29yazEKY291cnNlMiA8LSAoZXhhbTIgKiBleF93ZWlnaHQpICsgKGNvdXJzZXdvcmsyICogY3dfd2VpZ2h0KQoKb3ZlcmFsbF9ncmFkZSA8LSAoY291cnNlMSArIGNvdXJzZTIpLzIgIyBzaG91bGQgYmUgZGl2aWRlZCBieSAyLCBhcyB0aGVyZSBhcmUgdHdvIGNvdXJzZXMgbm90IHRocmVlCgpvdmVyYWxsX2dyYWRlCmBgYAoKIyMgU2FsYXJ5IGNhbGN1bGF0aW9uIGV4ZXJjaXNlCgpSb2JpbiBhbmQgQ2hhcmxpZSBhcmUgYSBtYXJyaWVkIGNvdXBsZSwgb25lIGdldHMgcGFpZCBhbiBob3VybHkgcmF0ZSwgdGhlIG90aGVyIGhhcyBhbiBhbm51YWwgc2FsYXJ5LiBUaGV5IHdhbnQgdG8gd29ya291dCBob3cgbXVjaCBhbm51YWwgc2FsYXJ5IHRoZXkgaGF2ZSBjb21iaW5lZCBiZWZvcmUgdGF4LiBPdXQgb2YgaW50ZXJlc3QgQ2hhcmxpZSBhbHNvIHdhbnRzIHRvIGtub3cgd2hhdCBoZXIgaG91cmx5IHJhdGUgaXMgYmVmb3JlIHRheC4KClRoZXkgdXNlZCBzaW1wbGUgY2FsY3VsYXRpb25zIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYXM6CgoobnVtYmVyIGhvdXJzIHdvcmtlZCBwZXIgd2VlayB4IGhvdXJseSByYXRlKSB4IG51bWJlciBvZiB3ZWVrcyB3b3JrZWQgPSBhbm51YWwgc2FsYXJ5IChhbm51YWwgc2FsYXJ5IMO3IG51bWJlciBvZiB3ZWVrcyBpbiBhIHllYXIpIMO3IGhvdXJzIHdvcmtlZCBwZXIgd2VlayA9IGhvdXJseSByYXRlCgpSZS1hcnJhbmdlIHRoZSBjb2RlIHNvIHRoZSBjYWxjdWxhdGlvbnMgcnVuLiBZb3Ugc2hvdWxkIGhhdmUgYm90aCB0aGUgY29tYmluZWQgc2FsYXJ5IGFuZCBDaGFybGllcyBob3VybHkgcmF0ZSBjYWxjdWxhdGlvbnMgcHJpbnRlZC4KCmBgYHtyIGV2YWw9RkFMU0V9CiMgTm90ZTogSG91cnMgd29ya2VkLCBzYWxhcmllcyBhbmQgd2Vla3MgaW4geWVhciBjYW4gYmUgaW4gYW55IG9yZGVyIGJ1dCBuZWVkCiMgdG8gYmUgYWJvdmUgdGhlIHJlc3Qgb2YgdGhlIGNvZGUKCiMgaG91cnMgd29ya2VkClJvYmluX2hvdXJzUGVyV2VlayA8LSAyNQpSb2Jpbl93ZWVrc1dvcmtpbmcgPC0gNDgKQ2hhcmxpZV9ob3Vyc1BlcldlZWsgPC0gMzUKCiMgc2FsYXJpZXMKUm9iaW5fSG91cmx5UmF0ZSA8LSAxNi41CkNoYXJsaWVfYW5udWFsU2FyeSA8LSAzMTgwMAoKIyB3ZWVrcyBpbiB5ZWFyCndlZWtzWWVhciA8LSA1MgoKIyBDaGFybGllcyBob3VybHkgcmF0ZQpDaGFybGllX0hvdXJseVJhdGUgPC0gKENoYXJsaWVfYW5udWFsU2FyeSAvIHdlZWtzWWVhcikvQ2hhcmxpZV9ob3Vyc1BlcldlZWsKQ2hhcmxpZV9Ib3VybHlSYXRlCgojIFJvYmlucyBhbm51YWwgc2FsYXJ5ClJvYmluX2FubnVhbFNhbGFyeSA8LSAoUm9iaW5faG91cnNQZXJXZWVrICogUm9iaW5fSG91cmx5UmF0ZSkgKiBSb2Jpbl93ZWVrc1dvcmtpbmcKUm9iaW5fYW5udWFsU2FsYXJ5CgojIENvbWJpbmVkIHNhbGFyaWVzCkNvbWJpbmVkU2FsYXJpZXMgPC0gUm9iaW5fYW5udWFsU2FsYXJ5ICsgQ2hhcmxpZV9hbm51YWxTYXJ5CkNvbWJpbmVkU2FsYXJpZXMKCmBgYAoKIyBGaW5hbCB0YXNrIC0gUGxlYXNlIGdpdmUgdXMgeW91ciBpbmRpdmlkdWFsIGZlZWRiYWNrIQoKV2Ugd291bGQgYmUgZ3JhdGVmdWwgaWYgeW91IGNvdWxkIHRha2UgYSBtaW51dGUgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHdvcmtzaG9wIHNvIHdlIGNhbiBnZXQgeW91ciBmZWVkYmFjayEKClw8PGh0dHBzOi8vbHNlLmV1LnF1YWx0cmljcy5jb20vamZlL2Zvcm0vU1ZfZWZsYzJ5ajRwY3J5YzYyP2NvdXJzZW5hbWU9Uj4gRnVuZGFtZW50YWxzIDE6IE51bWVyaWNhbCBWYXJpYWJsZXMgJnRvcGljPVImbGluaz08aHR0cHM6Ly9sc2VjbG91ZC5zaGFyZXBvaW50LmNvbS86Zjovcy9URUFNX0FQRC1EU0wtRGlnaXRhbC1Ta2lsbHMtVHJhaW5lcnMvRW14eDM4eG9CNUZQdmFiSlBlWUJQcnNCRzdzTmJRNU5BTmtDVFJuUFZQS3RiZz9lPU1DWUNicCZwcm9nPURTJnZlcnNpb249MjEtMjI+XD4KCiMgSW5kaXZpZHVhbCBjb2RpbmcgY2hhbGxlbmdlCgpBIHRha2UgaG9tZSBjb2RpbmcgdGFzayBmb3IgeW91LgoKVGFzazogU3BsaXR0aW5nIGEgUGl6emEgUGlsZ3JpbXMgcmVzdGF1cmFudCBiaWxsIGJldHdlZW4gMyBmcmllbmRzOyBSb2dlciwgQW1hbCBhbmQgR2VuZXZpZXZlLgoKLSAgIFJvZ2VyIGhhcyBhIENhbHpvbmUgUmlwaWVubyAowqMxMSksIGFuZCBhIFNhbiBQZWxsZWdyaW5vICjCozIpLgotICAgQW1hbCBoYXMgYSBCdWZhbGEgKMKjOSksIGFuZCBCaXJyYSBNb3JldHRpICjCozQuNTApLgotICAgR2VuZXZpZXZlIGhhcyBhIFBvcnRvYmVsbG8gTXVzaHJvb20gJiBUcnVmZmxlICjCozEwKSwgYW5kIHdhdGVyIHRvIGRyaW5rLgotICAgR2VuZXZpZXZlIGFuZCBBbWFsIGFsc28gc2hhcmUgYSBOdXRlbGxhIFBpenphIHJpbmcgZm9yIGRlc3NlcnQgKMKjNS41KS4KCiFbXShodHRwczovL2dpdGh1Yi5jb20vYW5kcmV3bW9sZXMyL3JUcmFpbkludHJvZHVjdGlvbi9ibG9iL21haW4vci1mdW5kYW1lbnRhbHMtMS9JbWFnZXMvcGl6emFQLmpwZz9yYXc9dHJ1ZSkKCjEpICBNYWtlIGEgdmFyaWFibGUgZm9yIGVhY2ggZnJpZW5kIHRoYXQgaXMgdGhlIHN1bSBvZiB0aGVpciBvcmRlciAoZS5nLiBSb2dlciB3b3VsZCBiZSAxMSArIDIpCjIpICBNYWtlIGEgdmFyaWFibGUgZm9yIHRoZSBzaGFyZWQgZm9vZAozKSAgTWFrZSBhIHZhcmlhYmxlIGNhbGxlZCBUb3RhbEJpbGwsIGFuZCBjYWxjdWxhdGUgdGhlaXIgdG90YWwgYmlsbAo0KSAgRm9yIHRob3NlIHRoYXQgc2hhcmVkIGZvb2QsIGFkZCB0aGUgc2hhcmVkIGZvb2QgdG8gdGhlaXIgYmlsbAo1KSAgQ29tbWVudCB5b3VyIGNvZGUKNikgIFByaW50IHRoZSB0b3RhbCBiaWxsIGFuZCB3aGF0IGVhY2ggZnJpZW5kIG93ZXMKCmBgYHtyfQojIGluZGl2aWR1YWwgY29kaW5nIGNoYWxsZW5nZQoKIyBzdW0gb2Ygb3JkZXIgYW5kIHNoYXJlZCBmb29kClJvZ2VyIDwtIDExICsgMgpBbWFsIDwtIDkgKyA0LjUKR2VuZXZpZXZlIDwtIDEwClNoYXJlZEZvb2QgPC0gNS41CgojIGJpbGwgdG90YWwKVG90YWxCaWxsIDwtIFJvZ2VyICsgQW1hbCArIEdlbmV2aWV2ZSArIFNoYXJlZEZvb2QKCiMgc2hhcmVkIGZvb2Qgc3VtCkFtYWwgPC0gQW1hbCArIChTaGFyZWRGb29kLzIpCkdlbmV2aWV2ZSA8LSBHZW5ldmlldmUgKyAoU2hhcmVkRm9vZC8yKQoKIyB0b3RhbCBiaWxsClRvdGFsQmlsbAoKIyBpbmRpdmlkdWFsIGJpbGwKUm9nZXIKQW1hbApHZW5ldmlldmUKYGBgCgojIFJlY29tbWVuZGVkIGxpbmtzCgpSZWNvbW1lbmRlZCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgUlN0dWRpbyBlbnZpcm9ubWVudDogPGh0dHBzOi8vcmxhZGllc3N5ZG5leS5vcmcvY291cnNlcy9yeW91d2l0aG1lLzAxLWJhc2ljYmFzaWNzLTEvPlwKUmVjb21tZW5kZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgUiBNYXJrZG93bjogPGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL2xlc3Nvbi0xLmh0bWw+Cg==